package com.wechat.it.isales.auth.server.handler;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.security.authentication.AnonymousAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.GrantedAuthorityImpl;
import org.springframework.security.core.context.SecurityContextHolder;

public class SpringOAuthAuthenticationFilter implements Filter {
	public static final String OAUTH_AUTHORITIES = "oauth_authorities";

	public void init(FilterConfig filterConfig) throws ServletException {
	}

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
			ServletException {
		HttpServletRequest req = (HttpServletRequest) request;
		HttpServletResponse resp = (HttpServletResponse) response;

		List<String> authorities = (List<String>) request.getAttribute(OAUTH_AUTHORITIES);
		List<GrantedAuthority> grantedAuthorities = new ArrayList<GrantedAuthority>();

		if (authorities != null) {
			for (String authority : authorities) {
				grantedAuthorities.add(new GrantedAuthorityImpl(authority));
			}

			Authentication auth = new AnonymousAuthenticationToken(UUID.randomUUID().toString(),
					req.getUserPrincipal(), grantedAuthorities);

			SecurityContextHolder.getContext().setAuthentication(auth);
		}

		chain.doFilter(req, resp);
	}

	public void destroy() {

	}
}
